// Función que obtiene las coordenadas de latitud y longitud a partir de lo que
// proporciona el navegador (que, a su vez, toma de la IP).
// Después llamamos a la función envia_datos() pasándole las coordenadas.
function getLocation(nuevo) {
	if (navigator.geolocation) {
		navigator.geolocation.getCurrentPosition(function(position) {
													var latitud = position.coords.latitude;	//leemos
													var longitud = position.coords.longitude;
													envia_datos(latitud, longitud, nuevo);	//llamamos a función
													});
	}	else {	// Incluimos un else por si el navegador del usuario no es compatible.
			alert("Lo siento, tu navegador no soporta geolocalización, instálate la última versión de Mozilla :)");
		}
	}

// Función que carga una serie de puntos (pares de coordenadas) con sus nombres
// correspondientes en un mapa de Google Maps y lo añade al HTML.
function load(points, names) {
	if (GBrowserIsCompatible()) {
		var map = new GMap2(document.getElementById("map")); // En el código HTML tenemos que tener creado
															 // un contenedor con id="map".
		var centro = new Array(0,0);
		centro = obtener_centro(points);	// Llamamos a obtener_centro() porque necesitamos especificar
											// ese dato cuando creamos el mapa.
		map.setCenter(new GLatLng(centro[0],centro[1]), 13);
		map.addControl(new GMapTypeControl());
		map.addControl(new GLargeMapControl());
		map.addControl(new GScaleControl());
		map.addControl(new GOverviewMapControl());
	
		for (i in points) {	// Creamos marcadores con los nombres para cada punto.
			map.addOverlay(crear_marker(points[i], names[i]));
        }

	}	else {	// Incluimos un else por si el navegador del usuario no es compatible.
			alert("Lo siento, tu navegador no soporta Google Maps, instálate la última versión de Mozilla :)");
		}
}

// Función que obtiene la media de tantos puntos como se le pasen en un array,
// devuelve un array con la coordenada central de latitud y la de longitud.
function obtener_centro(puntos) {
	var medias = new Array(0, 0);
	for (i in puntos) {
		for (j in puntos[i]) {
			medias[j] += (puntos[i][j]*1);
		}
	}
	
	medias[0] /= puntos.length;
	medias[1] /= puntos.length;
	return medias;
}

// Función que crea un marcador en el mapa dados unas coordenadas y un nombre.
function crear_marker(punto, nombre) {
	var point = new GLatLng(punto[0], punto[1]);
	var marker = new GMarker(point);
	GEvent.addListener(marker, "click", function() {	// Añadimos el listener para que aparezca
														// el nombre al pinchar en el marcador.
											var myHtml = "<b>Alumno <b>" + nombre;
											marker.openInfoWindowHtml(myHtml);
      									});
	return marker; 
}

// Función que despliega un formulario sencillo para que el usuario intoduzca
// su nombre y, cuando le dé a enviar, el formulario se valide.
function crea_formulario(){
	var p = document.createElement('p');
	p.innerHTML = 'Nombre:';
	document.getElementById('formulario').appendChild(p);
	var texto = document.createElement('input');
	texto.setAttribute('type', 'text');      
	texto.setAttribute('name', 'nombre');
	document.getElementById('formulario').appendChild(texto);
	var p = document.createElement('p');
	document.getElementById('formulario').appendChild(p);
	var boton = document.createElement('input');
	boton.setAttribute('type', 'button');
	boton.setAttribute('value', 'Enviar');
	boton.setAttribute('onclick', 'validar()');
	document.getElementById('formulario').appendChild(boton);
}

// Función que comprueba que se haya escrito un nombre y que el mismo sea válido,
// es decir, no contenga números o símbolos.
function validar() {
	var dato = document.getElementById('formulario').nombre;
  var exp_regular = /(\w+\s*\w*)/;
	if (dato.value.length==0 || !exp_regular.test(dato.value)) {
		alert("Tiene que escribir un nombre y éste no puede contener ni números ni símbolos.");
		dato.focus();
		return 0;
	}	else {	// Si todo está correcto se llama a consulta_datos(nombre_ingresado).
			consulta_datos(dato.value);
		}
}

// Funciones para enviar datos a los CGIs y trabajar con los datos que recibamos de ellos.
var request;

function consulta_datos(nombreUsuario) {
	request = new XMLHttpRequest();
	var peticion_str = 'http://localhost/cgi-bin/comprobar.cgi?nombre='+nombreUsuario;
	request.open('GET', peticion_str , true);
	request.onreadystatechange= gestionar_usuario;
	request.send(null);
}

function gestionar_usuario() {
	if ( request.readyState == 4 ) {
		if ( request.status == 200 ) {
			var respuesta = request.responseText;
			if (respuesta == 1) {
				if(confirm("Hemos detectado que ya has introducido tu posición antes o bien hay alguien que se llama como tú. ¿Quieres actualizar tu posición?\nO si no eres tú pulsa \"Cancelar\" e introduce tu nombre con apellido.")) {
					getLocation(0);
				}	else {
						document.getElementById('formulario').nombre.focus();
					}
			}	else {
					alert("Hola nuevo usuario, tienes que aceptar compartir tu ubicación");
					getLocation(1);
				}
		}
	}
}

function consulta_registrados() {
	request = new XMLHttpRequest();
	var peticion_str = 'http://localhost/cgi-bin/consultar.cgi';
	request.open('GET', peticion_str , true);
	request.onreadystatechange= obtener_resultados ;
	request.send(null);
}

function obtener_resultados(){
	if ( request.readyState == 4 ) {
		if ( request.status == 200 ) {
			var doc = request.responseXML;
			var root = doc.documentElement;
			var usuarios = root.getElementsByTagName('usuario');
			var nombres = new Array(usuarios.length);
			var puntos = new Array(usuarios.length);
			for(var p = 0; p < usuarios.length; p++) puntos[p]=new Array(2);
			for ( var i = 0; i < usuarios.length; i ++ ) {
				nombres[i] = usuarios[i].getAttribute('nombre');
				puntos[i][0] = usuarios[i].getAttribute('latitud');
				puntos[i][1] = usuarios[i].getAttribute('longitud');
			}
		load(puntos, nombres);
		}
	}
}

function envia_datos(latitud, longitud, nuevo) {
	request = new XMLHttpRequest();
	var nombreUsuario = document.getElementById('formulario').nombre.value;
	var peticion_str = 'http://localhost/cgi-bin/guardar.cgi?nombre='+nombreUsuario+'&lat='+latitud+'&long='+longitud+'&new='+nuevo;
	request.open('GET', peticion_str , true);
	request.onreadystatechange= alert('Registro realizado');
	request.send(null);
	if(confirm("¿Quieres visualizar el mapa actualizado?")) {
		consulta_registrados();
	}
}

// Fin de las funciones en Javascript.
